package com.ruoyi.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.entity.Tag;
import com.ruoyi.mapper.TagMapper;
import com.ruoyi.service.TagService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 标签服务实现类
 *
 * @author ruoyi
 */
@Service
@Slf4j
public class TagServiceImpl extends ServiceImpl<TagMapper, Tag> implements TagService {

    /**
     * 获取所有启用的标签列表
     *
     * @return 启用的标签列表，按排序顺序升序排列
     */
    @Override
    public List<Tag> listEnabledTags() {
        LambdaQueryWrapper<Tag> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Tag::getEnabled, 1)
                .orderByAsc(Tag::getSortOrder);
        return list(wrapper);
    }

    /**
     * 根据类型获取启用的标签列表
     *
     * @param type 标签类型
     * @return 启用的标签列表，按排序顺序升序排列
     */
    @Override
    public List<Tag> listTagsByType(Integer type) {
        LambdaQueryWrapper<Tag> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Tag::getEnabled, 1)
                .eq(Tag::getType, type)
                .orderByAsc(Tag::getSortOrder);
        return list(wrapper);
    }

    /**
     * 根据ID获取标签
     *
     * @param id 标签ID
     * @return 标签对象
     */
    @Override
    public Tag getTagById(Integer id) {
        return getById(id);
    }

    /**
     * 创建标签
     *
     * @param tag 标签对象
     * @return 是否成功创建标签
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean createTag(Tag tag) {
        tag.setCreateTime(LocalDateTime.now());
        tag.setUpdateTime(LocalDateTime.now());
        // 默认启用状态
        if (tag.getEnabled() == null) {
            tag.setEnabled(1);
        }
        // 默认排序值
        if (tag.getSortOrder() == null) {
            tag.setSortOrder(0);
        }
        return save(tag);
    }

    /**
     * 更新标签
     *
     * @param tag 标签对象
     * @return 是否成功更新标签
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateTag(Tag tag) {
        tag.setUpdateTime(LocalDateTime.now());
        return updateById(tag);
    }

    /**
     * 删除标签
     *
     * @param id 标签ID
     * @return 是否成功删除标签
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean deleteTag(Integer id) {
        return removeById(id);
    }

    /**
     * 更新标签状态
     *
     * @param id      标签ID
     * @param enabled 新的状态
     * @return 是否成功更新标签状态
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateTagStatus(Integer id, Boolean enabled) {
        Tag tag = getById(id);
        if (tag == null) {
            log.warn("标签不存在，id={}", id);
            return false;
        }
        tag.setEnabled(enabled ? 1 : 0);
        tag.setUpdateTime(LocalDateTime.now());
        return updateById(tag);
    }
}
